home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 424_01 / ed_157 / express.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-09  |  4.0 KB  |  165 lines

  1. /*
  2.  * Copyright (C) 1992 by Rush Record
  3.  * Copyright (C) 1993 by Charles Sandmann (sandmann@clio.rice.edu)
  4.  * 
  5.  * This file is part of ED.
  6.  * 
  7.  * ED is free software; you can redistribute it and/or modify it under the terms
  8.  * of the GNU General Public License as published by the Free Software Foundation.
  9.  * 
  10.  * ED is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  11.  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
  13.  * 
  14.  * You should have received a copy of the GNU General Public License along with ED
  15.  * (see the file COPYING).  If not, write to the Free Software Foundation, 675
  16.  * Mass Ave, Cambridge, MA 02139, USA.
  17.  */
  18. #include "opsys.h"
  19.  
  20. #include <stdio.h>
  21.  
  22. #include "memory.h"
  23. #include "rec.h"
  24. #include "window.h"
  25. #include "ed_dec.h"
  26.  
  27.  
  28. /******************************************************************************\
  29. |Routine: express
  30. |Callby: get_colbyt inquire paint paint_window show_param
  31. |Purpose: Converts character data to printable data for screen display.
  32. |         Handles tab conversion and display of control characters.
  33. |Arguments:
  34. |    reclen is the length of the data to be converted.
  35. |    rec is the record containing the data to be converted.
  36. |    tab is the tab stop map.
  37. |    tablen is the length of the tab stop map.
  38. |    buf is the returned buffer that receives the converted data.
  39. |    maxlen is the maximum amount of data to be returned in buf.
  40. |    cvttabs is a flag that makes the routine treat spaces and tabs as control
  41. |            characters.
  42. \******************************************************************************/
  43. Int express(reclen,rec,tab,tablen,buf,maxlen,cvttabs)
  44. Int reclen,tablen,maxlen,cvttabs;
  45. Char *rec,*tab,**buf;
  46. {
  47.     static Char *bufp = NULL;
  48.     static Int bufl = 0;
  49.     static Char *hexstring = (Char *)"\
  50. 000102030405060708090a0b0c0d0e0f\
  51. 101112131415161718191a1b1c1d1e1f\
  52. 202122232425262728292a2b2c2d2e2f\
  53. 303132333435363738393a3b3c3d3e3f\
  54. 404142434445464748494a4b4c4d4e4f\
  55. 505152535455565758595a5b5c5d5e5f\
  56. 606162636465666768696a6b6c6d6e6f\
  57. 707172737475767778797a7b7c7d7e7f\
  58. 808182838485868788898a8b8c8d8e8f\
  59. 909192939495969798999a9b9c9d9e9f\
  60. a0a1a2a3a4a5a6a7a8a9aaabacadaeaf\
  61. b0b1b2b3b4b5b6b7b8b9babbbcbdbebf\
  62. c0c1c2c3c4c5c6c7c8c9cacbcccdcecf\
  63. d0d1d2d3d4d5d6d7d8d9dadbdcdddedf\
  64. e0e1e2e3e4e5e6e7e8e9eaebecedeeef\
  65. f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
  66.  
  67.     register Char *r,*t,*b,*end,*tabend,c;
  68.     register Int l,i;
  69.     register Char *p;
  70.     Char *tmp;
  71.  
  72.     if(!bufp)
  73.         bufp = (Char *)imalloc(bufl = 8192);
  74.     if(!maxlen)
  75.         maxlen = bufl;
  76.     if(maxlen > bufl)
  77.     {
  78.         while(bufl < maxlen)
  79.             bufl <<= 1;
  80.         ifree(bufp);
  81.         bufp = (Char *)imalloc(bufl);
  82.     }
  83.     r = rec;
  84.     t = tab;
  85.     b = bufp;
  86.     end = b + bufl - 1;
  87.     tabend = t + tablen;
  88.     l = reclen;
  89.     while(l > 0)
  90.     {
  91.         if((c = *r++) == '\t' && !cvttabs && !HEXMODE)
  92.         {
  93.             do
  94.             {
  95.                 if(b - bufp >= tablen)
  96.                 {
  97.                     do
  98.                     {
  99.                         *b++ = ' ';
  100.                         if(b >= end)
  101.                         {
  102.                             tmp = (Char *)imalloc(bufl << 1);
  103.                             memcpy(tmp,bufp,bufl);
  104.                             b = tmp + (b - bufp);
  105.                             ifree(bufp);
  106.                             end = (bufp = tmp) + (bufl <<= 1) - 1;
  107.                         }
  108.                     } while(((b - bufp) & 7));
  109.                     break;
  110.                 }
  111.                 *b++ = ' ';
  112.                 if(b >= end)
  113.                 {
  114.                     tmp = (Char *)imalloc(bufl << 1);
  115.                     memcpy(tmp,bufp,bufl);
  116.                     b = tmp + (b - bufp);
  117.                     ifree(bufp);
  118.                     end = (bufp = tmp) + (bufl <<= 1) - 1;
  119.                 }
  120.             } while(*++t == ' ');
  121.         }
  122.         else if((NONPRINTNCS(c) || ((c == 32) && cvttabs)) || HEXMODE)
  123.         {
  124.             i = ((Uchar)c);
  125.             i &= 0xff;
  126.             i <<= 1;
  127.             p = hexstring + i;
  128.             if(b + 4 >= end)
  129.             {
  130.                 tmp = (Char *)imalloc(bufl << 1);
  131.                 memcpy(tmp,bufp,bufl);
  132.                 b = tmp + (b - bufp);
  133.                 ifree(bufp);
  134.                 end = (bufp = tmp) + (bufl <<= 1) - 1;
  135.             }
  136.             *b++ = '<';
  137.             *b++ = *p++;
  138.             *b++ = *p++;
  139.             *b++ = '>';
  140.             t += 4;
  141.         }
  142.         else
  143.         {
  144.             *b++ = c;
  145.             if(b >= end)
  146.             {
  147.                 tmp = (Char *)imalloc(bufl << 1);
  148.                 memcpy(tmp,bufp,bufl);
  149.                 b = tmp + (b - bufp);
  150.                 ifree(bufp);
  151.                 end = (bufp = tmp) + (bufl <<= 1) - 1;
  152.             }
  153.             t++;
  154.         }
  155.         if(t == tabend)
  156.             t--;
  157.         l--;
  158.     }
  159.     *b = 0;
  160.     *buf = bufp;
  161.     l = b - bufp;
  162.     return(l);
  163. }
  164.  
  165.